package unq_ui.tp_robots_web_wicket;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import robots.domain.Robot;
import robots.models.CompetirAppModel;
import robots.models.CompraRobotAppModel;
import robots.models.JugadorAppModel;
import robots.models.MejoraRobotAppModel;
import robots.models.RepararRobotAppModel;
import robots.models.VentaRobotAppModel;
import unq_ui.tp_robots_web_wicket.tools.LinkVolver;
import unq_ui.tp_robots_web_wicket.tools.TablaRobots;

public class MainPage extends WebPage {

	private static final long serialVersionUID = -8207468804856260913L;
	JugadorAppModel model;
	final private Idioma idioma;
	
	public MainPage(JugadorAppModel model, Idioma idiomaSeleccionado) {
		this.idioma= idiomaSeleccionado;
		this.model= model;
		crearYAsignarTablaDeRobotsPropios("robotsPropiosTabla");
		crearYAsignarTablaDeRobotsContrincantes("robotsContrincantesTabla");
		crearYAsignarLabelsInformativos();
		crearCompetencia();
		
		new LinkVolver("volver", this , new HomePage(idiomaSeleccionado));
	}

	private void crearCompetencia() {
		add(new Link<CompetirAppModel>("competir"){
			private static final long serialVersionUID = 378657311273855448L;

			@Override
			public void onClick() {
				resetLabelInformativos();
				setResponsePage(new CompetenciaPage(new CompetirAppModel(model.getJugador(),model.getSistema()),model,idioma));
			}
		});
		
		add(new Link<CompraRobotAppModel>("comprar") {
			private static final long serialVersionUID = 2186528000490515465L;

			public void onClick() {
				 resetLabelInformativos();
				 setResponsePage(new CompraPage(new CompraRobotAppModel(model), model,idioma ));
			 }
			});
	}

	private void crearYAsignarLabelsInformativos() {
		add(new Label("dineroDeJugador", this.idioma.dineroJugador_2 + model.getJugador().getDinero().toString()));
		add(new Label("compraVentaRespueta", mostrarCompraVentaResputesta()));
		add(new Label("respuestaDeCompetir", this.model.getRespuestaDeCompetir()));
	}


	private String mostrarCompraVentaResputesta() {
		return model.getCompraVentaReparacionMejoraRespuest() != null ? model.getCompraVentaReparacionMejoraRespuest() : null;
	}

	@SuppressWarnings("serial")
	private void crearYAsignarTablaDeRobotsPropios(String idTabla) {
		add(new Label("tituloTablaMisRobots",this.idioma.tituloTablaMisRobots_2));
		agregarCabecerasDeTablaMisRobots();
		@SuppressWarnings({ "unchecked", "rawtypes" })
		final TablaRobots tablaPropios = new TablaRobots(idTabla,
				new ListDataProvider(model.getJugador().getRobots())) {

			public void populateItem(final Item item) {
				final Robot robot = (Robot) item.getModelObject();
				
				crearColumnasBasicasDeTabla(item);
				
				item.add(new Link<Robot>("vender") {
					@Override
					public void onClick() {
						final VentaRobotAppModel modelVenta = new VentaRobotAppModel(
								model.getJugador(), model.getSistema(), robot);
						modelVenta.setRobot(robot);
						resetLabelInformativos();
						setResponsePage(new VentaPage(modelVenta, model, idioma));
					}
				});
				
				item.add(new AjaxLink<RepararRobotAppModel>("reparar") {
					private static final long serialVersionUID = 6885115212731127652L;
					public void onClick(AjaxRequestTarget target) {
						 resetLabelInformativos();
							if (robot.getDanio() ==0)
								target.appendJavaScript("alert('" + idioma.seleccionaUnRobotConDanio_2 + "');");
							else {
								resetLabelInformativos();
								setResponsePage(new RepararPage(new RepararRobotAppModel(robot, model.getJugador()), model, idioma));
							}
					 }
					});
				
				item.add(new AjaxLink("mejorar") {
					private static final long serialVersionUID = 8558067033078751390L;
					@Override
					public void onClick(AjaxRequestTarget target) {
						resetLabelInformativos();
						setResponsePage(new MejorarPage(model, new MejoraRobotAppModel(robot), idioma));
					}
					});
			}
		};
		add(tablaPropios);
	}

	private void agregarCabecerasDeTablaMisRobots() {
		add(new Label("nombreTablaMisR",this.idioma.nombreTabla_2));
		add(new Label("poderTotalTablaMisR",this.idioma.poderTotalTabla_2));
		add(new Label("deterioroTablaMisR",this.idioma.deterioroTabla_2));
		add(new Label("poderEfectivoTablaMisR",this.idioma.poderEfectivoTabla_2));
	}
	
	private void resetLabelInformativos(){
		model.setCompraVentaReparacionMejoraRespuest(null);
		model.setRespuestaDeCompetir(null);
	}


	private void crearYAsignarTablaDeRobotsContrincantes(String idTabla) {
		add(new Label("tituloTablaRobotsContrincantes",this.idioma.tituloTablaRobotsContrincantes_2));
		agregarCabecerasDeTablaRobotsContrincates();
		final DataView<Robot> tablaContrincantes = new DataView<Robot>(idTabla,new ListDataProvider<Robot>(model.getRobotsContrincantes())) {
			private static final long serialVersionUID = 1L;
			public void populateItem(final Item<Robot> item) {
				final Robot robot = (Robot) item.getModelObject();
				item.add(new Label("nombre", robot.getNombre()));
				item.add(new Label("poderTotal", robot.getPoderTotal().toString()));
				item.add(new Label("deterioro", robot.getDanio().toString()));
				item.add(new Label("poderEfectivo", robot.getPoderEfectivo().toString()));
				item.add(new Label("duenio", robot.getJugador().getNombre().toString()));
			}
		};
		add(tablaContrincantes);
	}
	
	private void agregarCabecerasDeTablaRobotsContrincates() {
		add(new Label("nombreTablaRContrincantes",this.idioma.nombreTabla_2));
		add(new Label("poderTotalTablaRContrincantes",this.idioma.poderTotalTabla_2));
		add(new Label("deterioroTablaRContrincantes",this.idioma.deterioroTabla_2));
		add(new Label("poderEfectivoTablaRContrincantes",this.idioma.poderEfectivoTabla_2));
		add(new Label("duenioTablaRContrincantes",this.idioma.duenioTabla_2));
	}

	public JugadorAppModel getModel(){
		return model;
	}
}
